import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 从环境变量获取API基础URL，默认为'/api'
  timeout: 30000, // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    if (token) {
      // 根据接口文档要求，token需要放在请求头的token字段中
      config.headers['token'] = token
    }
    
    // 特殊处理日期参数
    if (config.params) {
      console.log('请求参数处理前:', JSON.stringify(config.params))
      
      // 确保日期参数正确传递
      if (config.params.hireDateStart) {
        console.log('处理hireDateStart参数:', config.params.hireDateStart)
        // 确保日期格式正确 (YYYY-MM-DD)
        if (typeof config.params.hireDateStart === 'string' && config.params.hireDateStart.trim() !== '') {
          // 日期格式已经在组件中确保正确，这里不再做额外处理
          console.log('使用hireDateStart日期:', config.params.hireDateStart)
        }
      }
      
      if (config.params.hireDateEnd) {
        console.log('处理hireDateEnd参数:', config.params.hireDateEnd)
        // 确保日期格式正确 (YYYY-MM-DD)
        if (typeof config.params.hireDateEnd === 'string' && config.params.hireDateEnd.trim() !== '') {
          // 日期格式已经在组件中确保正确，这里不再做额外处理
          console.log('使用hireDateEnd日期:', config.params.hireDateEnd)
        }
      }
      
      console.log('请求参数处理后:', JSON.stringify(config.params))
    }
    
    // 处理POST请求数据
    if (config.method === 'post' && config.data) {
      console.log('POST请求数据处理前:', JSON.stringify(config.data))
      
      // 员工相关请求的特殊处理
      if (config.url.includes('/emps') && !config.url.includes('/emps/')) {
        // 确保密码字段存在
        if (!config.data.password) {
          config.data.password = '123456'
          console.log('自动添加默认密码')
        }
        
        // 确保工作经历字段名称正确
        if (config.data.exprList && !config.data.workExperiences) {
          config.data.workExperiences = config.data.exprList
          delete config.data.exprList
          console.log('将exprList转换为workExperiences')
        }
        
        // 处理图片数据
        if (config.data.image && typeof config.data.image === 'string') {
          // 记录图片数据大小，但不做限制
          const imageSizeKB = Math.round(config.data.image.length / 1.37 / 1024);
          console.log('图片数据大小:', imageSizeKB, 'KB');
        }
        
        // 确保所有必要字段都存在
        const requiredFields = ['username', 'name', 'gender', 'phone', 'position', 'salary', 'deptId', 'hireDate']
        for (const field of requiredFields) {
          if (!config.data[field] && config.data[field] !== 0) {
            console.warn(`缺少必要字段: ${field}`)
          }
        }
        
        // 如果没有设置头像，使用默认头像
        if (!config.data.image) {
          config.data.image = ''
          console.log('使用默认头像')
        }
      }
      
      console.log('POST请求数据处理后:', JSON.stringify(config.data))
    }
    
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 模拟检查手机号是否存在的接口
    if (response.config.url.includes('/emps/check-phone')) {
      console.log('模拟检查手机号API调用:', response.config.url);
      
      // 这里可以根据需要模拟返回某些号码已存在
      // 例如：模拟13800000000已存在
      const phoneParam = new URLSearchParams(response.config.url.split('?')[1]).get('phone');
      if (phoneParam === '13800000000') {
        return {
          code: 1,
          data: true,
          msg: '手机号已存在'
        };
      }
      
      // 默认返回不存在
      return {
        code: 1,
        data: false,
        msg: '手机号可用'
      };
    }
    
    const res = response.data
    // 如果返回的状态码不是1，则判断为错误
    if (res.code !== 1) {
      ElMessage({
        message: res.msg || '请求失败',
        type: 'error',
        duration: 5 * 1000
      })
      
      // 401: 未登录或token过期
      if (res.code === 401) {
        // 可以在这里处理登出逻辑
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        window.location.href = '/login'
      }
      return Promise.reject(new Error(res.msg || '请求失败'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error)
    
    // 401: 未登录或token过期
    if (error.response && error.response.status === 401) {
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      window.location.href = '/login'
      ElMessage.error('登录已过期，请重新登录')
      return Promise.reject(error)
    }
    
    // 不显示 400/404 错误提示，但保留功能
    if (error.response && (error.response.status === 400 || error.response.status === 404)) {
      console.log(`Suppressed ${error.response.status} error:`, error.message)
      return Promise.reject(error)
    }
    
    // 其他错误正常显示
    ElMessage({
      message: error.message || '请求失败，请检查网络',
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service 